#pragma once

#include "ezstl_deque.hpp"
namespace ezstl {

template <typename T, typename Sequence = ezstl::Deque<T>>
class Stack {
 public:
  using value_type = typename Sequence::value_type;
  using size_type = typename Sequence::size_type;
  using reference = typename Sequence::reference;
  using const_reference = typename Sequence::const_reference;

 protected:
  Sequence c;

 public:
  Stack() : c{} {}
  
  bool empty() const { return c.empty(); }
  size_type size() const { return c.size(); }
  reference top() { return c.back(); }
  const_reference top() const { return c.back(); }
  void push(const_reference value) { c.push_back(value); }
  void pop() { c.pop_back(); }

 private:
  // friend bool operator==(const Stack &, const Stack &);
  // friend bool operator<(const Stack &, const Stack &);
};

}  // namespace ezstl